package com.atguigu;

import org.apache.spark.SparkConf;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.sql.expressions.UserDefinedFunction;
import org.apache.spark.sql.types.DataTypes;

import static org.apache.spark.sql.functions.udf;

/**
 * @author yhm
 * @create 2022-12-26 9:17
 */
public class Test03_UDF {
    public static void main(String[] args) {
        // 1. 创建sparkConf配置对象
        SparkConf conf = new SparkConf().setAppName("sql").setMaster("local[*]");

        // 2. 创建sparkSession连接对象
        SparkSession spark = SparkSession.builder().config(conf).getOrCreate();

        // 3. 编写代码
        Dataset<Row> dataset = spark.read().json("input/user.json");

        // 创建视图
        dataset.createOrReplaceTempView("t1");

        // UDF  ->  针对当前一行数据进行处理  得到一个结果
        // UDAF ->  在使用完分组group by之后 对于一个组的数据进行聚合 得到一个结果
        // UDTF ->  针对当前一行数据进行炸裂  得到多行数据

        // 自定义函数传入user的name  输出 name+"大侠"
        // 创建udf需要先导入一个依赖
        //import static org.apache.spark.sql.functions.udf;
        //import org.apache.spark.sql.api.java.UDF1;

        UserDefinedFunction definedFunction = udf(new UDF1<String, String>() {
            @Override
            public String call(String s) throws Exception {
                return s + "大侠";
            }
        }, DataTypes.StringType);
        // 需要首先定义函数
        spark.udf().register("addName", definedFunction);

        spark.sql("select addName(name) newName,age from t1").show();


        // 4. 关闭sparkSession
        spark.close();
    }
}
